'use strict'
const path = require('path')
const defaultSettings = require('./src/settings.js')

function resolve(dir) {
  return path.join(__dirname, dir)
}

const name = defaultSettings.title || '油气管道动火作业综合监控平台' // page title

// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
  /**
   * You will need to set publicPath if you plan to deploy your site under a sub path,
   * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
   * then publicPath should be set to "/bar/".
   * In most cases please use '/' !!!
   * Detail: https://cli.vuejs.org/config/#publicpath
   */
  publicPath: process.env.NODE_ENV === 'production' ? '/admin' : '/',
  outputDir: 'dist/admin',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  pages: {
    index: {
      // page 的入口
      entry: 'src/pages/index/main.js',
      // 模板来源
      template: 'public/index.html',
      // 在 dist/index.html 的输出
      filename: 'index.html',
      // 当使用 title 选项时，
      // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
      title: defaultSettings.title,
      // 在这个页面中包含的块，默认情况下会包含
      // 提取出来的通用 chunk 和 vendor chunk。
      chunks: ['chunk-vendors', 'chunk-common', 'index']
    },
    enterprise: {
      // page 的入口
      entry: 'src/pages/enterprise/main.js',
      title: '企业管理-' + defaultSettings.title
    },
    // // 当使用只有入口的字符串格式时，
    // // 模板会被推导为 `public/subpage.html`
    // // 并且如果找不到的话，就回退到 `public/index.html`。
    // // 输出文件名会被推导为 `subpage.html`。
    project: {
      // page 的入口
      entry: 'src/pages/project/main.js',
      // 当使用 title 选项时，
      // template 中的 title 标签需要是 <title><%= htmlWebpackPlugin.options.title %></title>
      title: '项目管理-' + defaultSettings.title
    }
  },
  devServer: {
    disableHostCheck: true,
    proxy: {
      // change xxx-api/login => mock/login
      // detail: https://cli.vuejs.org/config/#devserver-proxy
      '/ekjdTest/': {
        target: process.env.VUE_APP_BASE_URL,
        changeOrigin: true,
        pathRewrite: {
          '^/ekjdTest/': '/ekjdTest/'
        }
      },
      '/ekjdgz/': {
        target: process.env.VUE_APP_BASE_URL,
        changeOrigin: true,
        pathRewrite: {
          '^/ekjdgz/': '/ekjdgz/'
        }
      },
      '/api/v1/': {
        target: process.env.VUE_APP_BASE_URL,
        changeOrigin: true,
        pathRewrite: {
          '^/api/v1/': '/api/v1/'
        }
      },
      '/upload/': {
        target: process.env.VUE_APP_BASE_URL,
        changeOrigin: true,
        pathRewrite: {
          '^/upload/': '/upload/'
        }
      }
    }
  },
  configureWebpack: config => {
    config.module.rules.filter(rule => {
      return rule.test.toString().indexOf('scss') !== -1
    })
      .forEach(item => {
        item.oneOf.forEach(oneOfRule => {
          oneOfRule.use.splice(oneOfRule.use.indexOf(require.resolve('sass-loader')), 0,
            { loader: require.resolve('./css-unicode-loader') })
        })
      })
  },
  chainWebpack(config) {
    config.plugins.delete('preload') // TODO: need test
    config.plugins.delete('prefetch') // TODO: need test

    const scss = config.module.rule('scss').toConfig()
    const useable = { ...scss.oneOf[3], test: /\.theme.scss$/ }
    useable.use = [...useable.use]
    useable.use[0] = {
      loader: 'style-loader', options: {
        injectType: 'lazyStyleTag' // 原文中采用了useable，在我使用的过程中发生报错，查阅英文文档修正
      }
    }
    config.module.rule('scss').merge({ oneOf: [useable] }).end()
    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()

    // set preserveWhitespace
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.compilerOptions.preserveWhitespace = true
        return options
      })
      .end()
  }
}
